﻿Public Class ObjektTextbox
    Inherits Objekt2D
    Dim TextAnzeiger As ObjektText
    Dim GeschriebenerText As String = ""
    Dim Frame2 As Integer = 0
    Dim Buchstabenbreite As Integer = 0

    Dim Buchstabenhöhe As Integer
    ''' <summary>
    ''' 0 bedeutet der Text wird ganz am Anfang eingefügt 1 bedeutet nach dem ersten Buchstaben.
    ''' </summary>
    ''' <remarks></remarks>
    Dim Cursorposition As Integer = 0
    Dim Buchstabenzahl As Integer = 0
    Dim BuchstabenStart As Integer = 0
    ''' <summary>
    ''' Momentan machen wir nur eine Zeile ansonsten wäre das hier um einiges Komplizierter
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Breite"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Breite As Integer, ByVal Fixed As PointF, Optional ByVal Handler As ObjektPanel = Nothing)
        MyBase.New("Textbox", New Rectangle(X + 2, Y, Breite, 21), New Point(X, Y), Fixed, Handler)
        TextAnzeiger = New ObjektText(New String() {}, X + 2, Y + 1, Nothing, "Courier New", 14, FontStyle.Regular)
        Buchstabenbreite = TextAnzeiger.GetSchriftart.MeasureString(Schriftengine.Sprite2, "A", Microsoft.DirectX.Direct3D.DrawTextFormat.None, Color.Black).Width
        Buchstabenhöhe = TextAnzeiger.GetSchriftart.MeasureString(Schriftengine.Sprite2, "A", Microsoft.DirectX.Direct3D.DrawTextFormat.None, Color.Black).Height
        Buchstabenzahl = Math.DivRem(Breite, Buchstabenbreite, 0)
        AddHandler Hauptmenü.MainMenü.MalPanel.MouseUp, AddressOf MouseUp2
        AddHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown2
        AddHandler Hauptmenü.MainMenü.KeyDown, AddressOf Keydown2
    End Sub

    Public Overrides Function Keydown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean

    End Function
    Public Overrides Function KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean

    End Function
    Public Overrides Function MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean

    End Function
    Public Overrides Function MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean

    End Function
    Public Overrides Function MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As String
        Return ""
    End Function

#Region "Eventhandling mit anderen Subs"
    ''' <summary>
    ''' Hinweis die dritt Belegung von Tasten wird nicht geschrieben.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Public Sub Keydown2(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        If IsVisble() Then
            If Focused Then
                Select Case e.KeyCode
                    Case Keys.Back
                        'Wenn was gelöscht wird dann nur wenn was zu löschen da ist
                        If Cursorposition > 0 Then
                            'Wir wollen was löschen.
                            GeschriebenerText = GeschriebenerText.Remove(Cursorposition - 1, 1)
                            Cursorposition -= 1
                        End If
                    Case Keys.Left
                        If Cursorposition > 0 Then Cursorposition -= 1
                    Case Keys.Right
                        If Cursorposition < GeschriebenerText.Length Then Cursorposition += 1
                    Case Keys.Delete
                        If Cursorposition < GeschriebenerText.Length Then
                            GeschriebenerText = GeschriebenerText.Remove(Cursorposition, 1)
                        End If
                End Select

                'Wir schauen ob wir auch wirklich eine Eingabe mit Buchstaben gemacht haben

            End If
            ShiftText()
        End If
    End Sub
    ''' <summary>
    ''' Sorgt dafür, dass zu langer Text für die Textbox auch richtig angezeigt wird sprich abgeschnitten wird
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ShiftText()
        'Nur jetzt müssen wir berechnen
        If GeschriebenerText.Length > Buchstabenzahl Then
            'Das hier ist jetzt nur eine Notlösung
            BuchstabenStart = Cursorposition - Math.DivRem(Buchstabenzahl, 2, 0)
            If BuchstabenStart < 0 Then
                BuchstabenStart = 0
            ElseIf GeschriebenerText.Length - Buchstabenzahl < BuchstabenStart Then
                BuchstabenStart = GeschriebenerText.Length - Buchstabenzahl
            End If
        Else
            BuchstabenStart = 0
        End If
    End Sub
    Public Sub MouseDown2(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If IsVisble() Then
            If (Not Objekt2D.AlreadyKlickt And Not HasFocus) Or Focused Then
                'wir haben auf dieses Textfeld geklickt.
                Dim R As New Rectangle(GetRealX, GetRealY, Rechteck.Width, Rechteck.Height)
                If R.Contains(e.Location) Then
                    Objekt2D.AlreadyKlickt = True
                    Focus()
                    Hauptmenü.MainMenü.txtChatbox.Text = ""
                    Hauptmenü.MainMenü.txtChatbox.Focus()
                    Cursorposition = Math.DivRem(e.X - GetRealX() - 2 + 5, Buchstabenbreite, 0) - BuchstabenStart
                    If Cursorposition < 0 Then Cursorposition = 0
                    If Cursorposition > GeschriebenerText.Length Then Cursorposition = GeschriebenerText.Length
                Else

                    Me.RemoveFocus()
                End If
            End If
        End If
    End Sub
    Protected Overrides Sub RemoveFocus()
        If Focused Then
            Hauptmenü.MainMenü.MalPanel.Focus()
            MyBase.RemoveFocus()
        End If
    End Sub
    Public Sub MouseUp2(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    End Sub
#End Region
    Public Sub SetText(ByVal Text As String)
        GeschriebenerText = Text
    End Sub
    Public Overrides Sub Malen()
        If Handler IsNot Nothing Then
            If Not Handler.IsVisible(New Rectangle(Koordinaten.X, Koordinaten.Y, Rechteck.Width + 2, Rechteck.Height), True) Then
                Exit Sub
            End If
        End If
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Dim P As Point = GetRealKoordinaten()
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        Grafikengine.ptfPosition = P
        'Zuerst malen wir den linken Rand
        With Grafikengine.recBild
            .X = 0 : .Width = 2
            .Y = 0 : .Height = 21
        End With
        Grafikengine.Sprite.Draw2D(Textur.getTextur(TexturID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        'Jetzt den rechten Rand
        Grafikengine.ptfPosition.X += Rechteck.Width + 2
        Grafikengine.recBild.X = 23
        Grafikengine.Sprite.Draw2D(Textur.getTextur(TexturID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        'und jetzt die Mitte
        Grafikengine.ptfPosition.X = P.X + 2
        With Grafikengine.recBild
            .X = 2 : .Width = 21
            .Y = 0 : .Height = 21
        End With
        Grafikengine.szfScale.Width = Rechteck.Width
        Grafikengine.szfScale.Height = 21
        Grafikengine.Sprite.Draw2D(Textur.getTextur(TexturID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

        Dim AnzeigeText As String = GeschriebenerText.Remove(0, BuchstabenStart)
        If Buchstabenzahl < AnzeigeText.Length Then
            AnzeigeText = AnzeigeText.Remove(Buchstabenzahl)
        End If

        TextAnzeiger.neuerText(New String() {AnzeigeText}, 2 + P.X, 1 + P.Y, Nothing)
        Grafikengine.Sprite.End()
        Schriftengine.Sprite2.Begin(Microsoft.DirectX.Direct3D.SpriteFlags.AlphaBlend)
        'Wir malen den Text.
        TextAnzeiger.Malen(Schriftengine.Sprite2)

        Schriftengine.Sprite2.End()
        Grafikengine.Sprite.Begin(Microsoft.DirectX.Direct3D.SpriteFlags.AlphaBlend)
        If Focused Then
            'Wir müssen jetzt diesen | malen
            Frame2 += 1
            If Frame2 > 11 Then Frame2 = 0
            If Frame2 < 6 Then
                Dim Pos As Integer = Cursorposition - BuchstabenStart
                Grafikengine.fillRect(New Rectangle(Pos * Buchstabenbreite + 2 + P.X, +2 + P.Y, 1, 17), Color.Black)
            End If
        End If
        If Cursorposition > AnzeigeText.Length Then
            Cursorposition = AnzeigeText.Length
        End If
        NextFrame()
    End Sub
    ''' <summary>
    ''' Übergibt den Text an diese Textbox
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub NextFrame()
        If Focused Then
            SyncLock Hauptmenü.MainMenü.txtChatbox
                Dim Länge As Integer = Hauptmenü.MainMenü.txtChatbox.TextLength
                If Länge > 0 Then
                    Dim Text As String = Hauptmenü.MainMenü.txtChatbox.Text
                    GeschriebenerText = GeschriebenerText.Insert(Cursorposition, Text)
                    Hauptmenü.MainMenü.txtChatbox.Text = ""
                    Cursorposition += Länge
                End If
            End SyncLock
            ShiftText()
        End If
    End Sub
    Public Overrides Sub RemoveHandles()
        Me.RemoveFocus()
        MyBase.RemoveHandles()
        RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseUp, AddressOf MouseUp2
        RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown2
        RemoveHandler Hauptmenü.MainMenü.KeyDown, AddressOf Keydown2
    End Sub
    Public Function GetText() As String
        Return GeschriebenerText
    End Function
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSize(PosChange)
        Bildgröße.X += PosChange.X * Fixed.X
        Bildgröße.Y += PosChange.Y * Fixed.Y
    End Sub
End Class
